package es.ibm.santillana.mdm.entryPreview.catalog;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ibm.ccd.common.context.AustinContext;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.OrderedJSONObject;
import com.ibm.pim.catalog.Catalog;
import com.ibm.pim.catalog.CatalogManager;
import com.ibm.pim.catalog.item.Item;
import com.ibm.pim.collaboration.CollaborationAreaManager;
import com.ibm.pim.common.exceptions.PIMSearchException;
import com.ibm.pim.context.Context;
import com.ibm.pim.context.PIMContextFactory;
import com.ibm.pim.hierarchy.Hierarchy;
import com.ibm.pim.hierarchy.HierarchyManager;
import com.ibm.pim.hierarchy.category.Category;
import com.ibm.pim.lookuptable.LookupTable;
import com.ibm.pim.lookuptable.LookupTableEntry;
import com.ibm.pim.lookuptable.LookupTableManager;
import com.ibm.pim.search.SearchQuery;
import com.ibm.pim.search.SearchResultSet;
import com.ibm.pim.selection.DynamicItemSelection;
import com.ibm.pim.selection.DynamicSelection;
import com.ibm.pim.selection.SelectionManager;
import com.ibm.pim.spec.SecondarySpec;
import com.ibm.pim.utils.Logger;
import com.ibm.pim.web.framework.dispatcher.AsyncEnabled;
import com.ibm.pim.web.framework.dispatcher.RequestResponseEnabled;

import es.ibm.santillana.mdm.clonation.ClonationManagement;
import es.ibm.santillana.mdm.common.bussinesmodel.ConfigModel;
import es.ibm.santillana.mdm.common.util.ConstSantillana;
import es.ibm.santillana.mdm.common.util.SantillanaLogger;

public class Busquedas implements AsyncEnabled,RequestResponseEnabled{ 

	private static final String QUERY_COMBO_PLAN_EDITORIAL = "select item from catalog('Planes_Editoriales')";
	private static final String QUERY_COMBO_SELLO = "select item from catalog('Sellos')";
	private static final String QUERY_COMBO_ASIGNATURA = "select item from catalog('Asignaturas') where item.category.pk = '";
	private static final String QUERY_COMBO_CURSO = "select item from catalog('Cursos') where item.category.pk = '";
	private static final String CCOMILLA = "'";
	private static final String QUERY_COMBO_TIPOLOGIA = "select item from catalog('Tipologias')";
	private static final String QUERY_COMBO_LINEA = "select item from catalog('Lineas') ";
	private static final String QUERY_COMBO_TIPO_PRODUCTO = "select item from catalog('Tipos_Productos') ";
	private static final String QUERY_COMBO_SOPORTE_PRODUCTO = "select item from catalog('Soportes') ";
	private static final String QUERY_COMBO_SERIE_METODO = "select item from catalog('Series_Metodos') ";
	private static final String QUERY_COMBO_OBRA_PROYECTO = "select item from catalog('Obras_Proyectos') ";
	private static final String QUERY_COMBO_AUTOR =  "select item from catalog('Autores') ";
	HttpServletRequest request;
	HttpServletResponse response;
	
	//send an json array for the collboration area  
	String responseContent ="";
	private static String sSpecName = "Generales";

	
	Context ctxPIM;
	CatalogManager ctgMan;
	Catalog catalogoMaestro;
	HierarchyManager hyMng;
	CollaborationAreaManager caMng;
	
	/* (sin Javadoc) 
	 * @see com.ibm.pim.web.framework.dispatcher.AsyncEnabled#getContentType()
	 */
	public String getContentType() {
		
		return JSON;
	}

	/* (sin Javadoc)
	 * @see com.ibm.pim.web.framework.dispatcher.AsyncEnabled#getResponseContent()
	 */
	public String getResponseContent() {
		
		return responseContent;
	}

	/* (sin Javadoc)
	 * @see com.ibm.pim.web.framework.dispatcher.RequestResponseEnabled#setRequest(javax.servlet.http.HttpServletRequest)
	 */
	public void setRequest(HttpServletRequest request) {
		
		this.request = request;
		
	}

	/* (sin Javadoc)
	 * @see com.ibm.pim.web.framework.dispatcher.RequestResponseEnabled#setResponse(javax.servlet.http.HttpServletResponse)
	 */
	public void setResponse(HttpServletResponse response) {
		this.response = response;
		
	}
	
	public void obtenerFormularioBusquedaGeneral() throws IOException, PIMSearchException{
		System.out.println("Obtener datos");
		
		AustinContext actx = (AustinContext)request.getSession().getAttribute("ctx");
		AustinContext.setCurrentContext(actx);
		
		
		JSONArray aListForms = obtenerDatosFormulario();
		
		responseContent = aListForms.serialize(true);		
	}
	
	private JSONArray obtenerDatosFormulario() throws PIMSearchException{
		System.out.println("Obtener Info Pack");
		
		JSONArray aListForms = new JSONArray();
		
		if(ctxPIM == null){
			ctxPIM = PIMContextFactory.getCurrentContext();
		}
		
		if(ctgMan==null){
			ctgMan = ctxPIM.getCatalogManager();
		}
		
		// Cargar jerarquias
		if(hyMng == null) {
			hyMng = ctxPIM.getHierarchyManager();
		}
		
		if (caMng == null) {
			caMng = ctxPIM.getCollaborationAreaManager();
		}
		
		Hierarchy hySociedades = hyMng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
		
		
		// Cargar item del catalogo Articulos
		if(catalogoMaestro==null){
			catalogoMaestro = ctgMan.getCatalog(ConstSantillana.MAESTRO_ARTICULOS);
		}
//		Item item = catalogoMaestro.getItemByPrimaryKey(sPk);


		OrderedJSONObject objVacio = new OrderedJSONObject();
		objVacio.put("Key", "NULL");
		objVacio.put("Value", "---NINGUNO---");
		//Rellena el json para el combo del curso
		JSONArray aTipologias = new JSONArray();
		aTipologias.add(objVacio);
		SearchQuery sqTipologia = ctxPIM.createSearchQuery(QUERY_COMBO_TIPOLOGIA);
		SearchResultSet rsTipologia = sqTipologia.execute();
		while(rsTipologia.next()){
			OrderedJSONObject objTipologia = new OrderedJSONObject();
			Item itmTipologia = rsTipologia.getItem(1);
			objTipologia.put("Key", itmTipologia.getPrimaryKey());
			objTipologia.put("Value", itmTipologia.getAttributeValue(ConstSantillana.TABLA_GLOBAL_VALOR));
			aTipologias.add(objTipologia);
		}
		aListForms.add(aTipologias);
		
		
		
		JSONArray aLineas = new JSONArray();
		aLineas.add(objVacio);
		SearchQuery sqLineas = ctxPIM.createSearchQuery(QUERY_COMBO_LINEA);
		SearchResultSet rsLineas = sqLineas.execute();
		while(rsLineas.next()){
			OrderedJSONObject objLineas = new OrderedJSONObject();
			Item itmLineas = rsLineas.getItem(1);
			objLineas.put("Key", itmLineas.getPrimaryKey());
			objLineas.put("Value", itmLineas.getAttributeValue(ConstSantillana.TABLA_GLOBAL_VALOR));
			aLineas.add(objLineas);
		}
		aListForms.add(aLineas);

		
		

		//Rellena el json para el combo del Sello
		JSONArray aTipoProducto = new JSONArray();
		aTipoProducto.add(objVacio);
		SearchQuery sqTipoProducto = ctxPIM.createSearchQuery(QUERY_COMBO_TIPO_PRODUCTO);
		SearchResultSet rsTipoProducto = sqTipoProducto.execute();
		while(rsTipoProducto.next()){
			OrderedJSONObject objsello = new OrderedJSONObject();
			Item itmTipoProducto = rsTipoProducto.getItem(1);
			objsello.put("Key", itmTipoProducto.getPrimaryKey());
			objsello.put("Value", itmTipoProducto.getAttributeValue(ConstSantillana.TABLA_GLOBAL_VALOR));
			aTipoProducto.add(objsello);
		}
		aListForms.add(aTipoProducto);
		
		JSONArray aSoporteProducto = new JSONArray();
		aSoporteProducto.add(objVacio);
		SearchQuery sqSoporteProducto = ctxPIM.createSearchQuery(QUERY_COMBO_SOPORTE_PRODUCTO);
		SearchResultSet rsSoporteProducto = sqSoporteProducto.execute();
		while(rsSoporteProducto.next()){
			OrderedJSONObject objSoporteProducto = new OrderedJSONObject();
			Item itmSoporteProducto = rsSoporteProducto.getItem(1);
			objSoporteProducto.put("Key", itmSoporteProducto.getPrimaryKey());
			objSoporteProducto.put("Value", itmSoporteProducto.getAttributeValue(ConstSantillana.TABLA_GLOBAL_VALOR));
			aSoporteProducto.add(objSoporteProducto);
		}
		aListForms.add(aSoporteProducto);
		
		JSONArray aSellos = new JSONArray();
		aSellos.add(objVacio);
		SearchQuery sqSello = ctxPIM.createSearchQuery(QUERY_COMBO_SELLO);
		SearchResultSet rsSello = sqSello.execute();
		while(rsSello.next()){
			OrderedJSONObject objsello = new OrderedJSONObject();
			Item itmSello = rsSello.getItem(1);
			objsello.put("Key", itmSello.getPrimaryKey());
			objsello.put("Value", itmSello.getAttributeValue(ConstSantillana.TABLA_GLOBAL_VALOR));
			aSellos.add(objsello);
		}
		aListForms.add(aSellos);
		
		JSONArray aSerieMetodo = new JSONArray();
		aSerieMetodo.add(objVacio);
		SearchQuery sqSerieMetodo = ctxPIM.createSearchQuery(QUERY_COMBO_SERIE_METODO);
		SearchResultSet rsSerieMetodo = sqSerieMetodo.execute();
		while(rsSerieMetodo.next()){
			OrderedJSONObject objSerieMetodo = new OrderedJSONObject();
			Item itmSerieMetodo = rsSerieMetodo.getItem(1);
			objSerieMetodo.put("Key", itmSerieMetodo.getPrimaryKey());
			System.out.println("|" + itmSerieMetodo.getPrimaryKey() + "|");
			objSerieMetodo.put("Value", itmSerieMetodo.getAttributeValue("Series_Metodos/Valor/es_ES"));
			System.out.println("|" + itmSerieMetodo.getAttributeValue("Series_Metodos/Valor/es_ES") + "|");
			aSerieMetodo.add(objSerieMetodo);
		}
		aListForms.add(aSerieMetodo);
		
		JSONArray aObraProyecto= new JSONArray();
		aObraProyecto.add(objVacio);
		SearchQuery sqbraProyecto = ctxPIM.createSearchQuery(QUERY_COMBO_OBRA_PROYECTO);
		SearchResultSet rsObraProyecto = sqbraProyecto.execute();
		while(rsObraProyecto.next()){
			OrderedJSONObject objObraProyecto = new OrderedJSONObject();
			Item itmObraProyecto = rsObraProyecto.getItem(1);
			objObraProyecto.put("Key", itmObraProyecto.getPrimaryKey());
			objObraProyecto.put("Value", itmObraProyecto.getAttributeValue(ConstSantillana.TABLA_GLOBAL_VALOR));
			aObraProyecto.add(objObraProyecto);
		}
		aListForms.add(aObraProyecto);
		

		
		
		return aListForms;
		
	}
	
	public void obtenerDatosBusquedaGeneral() throws Exception{
		AustinContext actx = (AustinContext)request.getSession().getAttribute("ctx");
		AustinContext.setCurrentContext(actx);
		
		String pkSociedad = request.getParameter("pkSociedad");
		String sTipologia = request.getParameter("sTipologia");
		String sLinea = request.getParameter("sLinea");
		String sTipo = request.getParameter("sTipo");
		String sSoporte = request.getParameter("sSoporte");
		String sSello = request.getParameter("sSello");
		String sSerie = request.getParameter("sSerie");
		String sObra = request.getParameter("sObra");
		String sISBN = request.getParameter("sISBN");
		String sEAN = request.getParameter("sEAN");
		String sTitulo = request.getParameter("sTitulo");
		String sClave = request.getParameter("sClave");
		
		if(ctxPIM == null){
			ctxPIM = PIMContextFactory.getCurrentContext();
		}
//		hyMng = ctxPIM.getHierarchyManager();
//		Hierarchy hySociedadesTipo = hyMng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
//	
//		Category catSociedad = hySociedadesTipo.getCategoryByPrimaryKey(pkSociedad);
//
//			
//		Collection<SecondarySpec> listaSpecsSoci = catSociedad.getItemSecondarySpecs();
//		Iterator <SecondarySpec> itSpecsSoci = listaSpecsSoci.iterator();
//		String sSpecSociedad = null;
//		String sSpecSearch = null;
//		while (itSpecsSoci.hasNext()) {
//			SecondarySpec secSpec = itSpecsSoci.next();
//			String name = secSpec.getName();
//			if (!name.contains("SEARCH")) {
//				sSpecSociedad = name;
//			}
//			else {
//				sSpecSearch = name;
//			}
//		}
		
		
		
		System.out.println("sTipologia " + sTipologia);
		System.out.println("sLinea " + sLinea);
		System.out.println("sTipo " + sTipo);
		System.out.println("sSoporte " + sSoporte);
		System.out.println("sSello " + sSello);
		System.out.println("sSerie " + sSerie);
		System.out.println("sObra " + sObra);
		System.out.println("sISBN " + sISBN);
		System.out.println("sEAN " + sEAN);
		System.out.println("sTitulo " + sTitulo);
		System.out.println("sClave " + sClave);
		
		//query para obtener los posibles elementos del pack
		String sSelect = "select item from catalog('Articulos') where item.category.pk = '0691'";
		if(sClave.length()>0){
			sSelect = sSelect + " and item['"+ConstSantillana.MAESTRO_ARTICULOS_SPEC + "/Clave'] = "+Integer.parseInt(sClave.trim());
		}
		
		if(sTitulo.length()>0){
			sTitulo = sTitulo.replace("*", "%");
			sSelect = sSelect + " and item['"+ConstSantillana.TITULO_CORTO + "'] like '"+sTitulo.trim()+"'";
		}
		if(sTipologia.length()>0 && !sTipologia.equals("NULL")){
			sSelect = sSelect + " and item['"+ ConstSantillana.TIPOLOGIA + "'].pk = '"+sTipologia.trim()+CCOMILLA;
		}
		if(sLinea.length()>0 && !sLinea.equals("NULL")){
			sSelect = sSelect + " and item['"+ ConstSantillana.LINEA_ID +"'].pk = '"+sLinea.trim()+CCOMILLA;
		}
		if(sISBN.length()>0){
			sISBN = sISBN.replace("*", "%");
			sSelect = sSelect + " and item['"+ConstSantillana.ISBN+"'] like '"+sISBN.trim()+"'";
		}
		if(sEAN.length()>0){
			sEAN = sEAN.replace("*", "%");
			sSelect = sSelect + " and item['"+ConstSantillana.EAN+"'] like '"+sEAN.trim()+"'";
		}
		if(sSello.length()>0 && !sSello.equals("NULL")){
			sSelect = sSelect + " and item['"+ConstSantillana.SELLO_ID + "'].pk = '"+sSello.trim()+CCOMILLA;
		}
		if(sTipo.length()>0 && !sTipo.equals("NULL")){
			sSelect = sSelect + " and item['"+ ConstSantillana.TIPO_PRODUCTO_ATT + "'].pk = '"+sTipo.trim()+CCOMILLA;
		}
		if(sSoporte.length()>0 && !sSoporte.equals("NULL")){
			sSelect = sSelect + " and item['" + ConstSantillana.SOPORTE_PRODUCTO_ID + "'].pk = '"+sSoporte.trim()+CCOMILLA;
		}
		if(sSerie.length()>0 && !sSerie.equals("NULL")){
			sSelect = sSelect + " and item['"+ ConstSantillana.SERIE_METODO +"'].pk = '"+sSerie.trim()+CCOMILLA;
		}
		if(sObra.length()>0 && !sObra.equals("NULL")){
			sSelect = sSelect + " and item['"+ ConstSantillana.OBRA + "'].pk = '"+sObra.trim()+CCOMILLA;
		}
		LookupTableManager lkpMan = ctxPIM.getLookupTableManager();
		LookupTable lkp = lkpMan.getLookupTable("System Parameter LKP");
		LookupTableEntry itmLkpUser = lkp.getLookupTableEntry("user.admin.name");
		LookupTableEntry itmLkpPwd = lkp.getLookupTableEntry("user.admin.pwd");
		LookupTableEntry itmLkpCmp = lkp.getLookupTableEntry("company");
		
		String user = (String) itmLkpUser.getAttributeValue("Code_Value_LTS/Value");
		String pwd = (String) itmLkpPwd.getAttributeValue("Code_Value_LTS/Value");
		String cmp = (String) itmLkpCmp.getAttributeValue("Code_Value_LTS/Value");
		
		
	
		ctxPIM = PIMContextFactory.getContext(user, pwd, cmp);
	
		System.out.println("Query maravillosa : "+sSelect);
		SelectionManager selectMng = ctxPIM.getSelectionManager();
		DynamicItemSelection dynamic = (DynamicItemSelection) selectMng.getSelection("BusquedaTest");
		dynamic.setQuery(sSelect);
		dynamic.save();
		int idSelection = dynamic.getId();
		String sId = idSelection + "";
		String url = "http://10.100.80.160:7507/ccd_content/classicornew.wpc?doit=edit_selection_items&catalog_id=12209&selection_id=" + sId;
		OrderedJSONObject urlJSON = new OrderedJSONObject();
		System.out.println(url);
		urlJSON.put("url", url);
		JSONArray aResultado =   new JSONArray();
		aResultado.add(urlJSON);
		responseContent = aResultado.serialize(true);		
		
	}
	
//	public cargarAutores () {
//		JSONArray aAutores= new JSONArray();
//		aObraProyecto.add(objVacio);
//		SearchQuery sqAutores = ctxPIM.createSearchQuery(QUERY_COMBO_AUTOR);
//		SearchResultSet rsAutores = sqAutores.execute();
//		while(rsAutores.next()){
//			OrderedJSONObject objAutores = new OrderedJSONObject();
//			Item itmAutores = rsAutores.getItem(1);
//			objAutores.put("Key", itmAutores.getPrimaryKey());
//			objAutores.put("Value", itmAutores.getAttributeValue("Autores/Nombre"));
//			aAutores.add(objAutores);
//		}
//		aListForms.add(aAutores);
//	}
	public void buscar() throws IOException, SQLException, Exception{
		
		JSONArray aListOrden = new JSONArray();
		Logger log = SantillanaLogger.getLogger();
		log.logInfo("EN ACTION CLONADO");
		System.out.println("buscar");
		OrderedJSONObject urlJSON = new OrderedJSONObject();
		Context ctx = PIMContextFactory.getCurrentContext();
		
		String country = ConfigModel.getCountryCodeFromUser(ctx.getCurrentUser());
		log.logInfo("country "+country);
		LookupTableManager lkpMan = ctx.getLookupTableManager();
		LookupTable lkp = lkpMan.getLookupTable("System Parameter LKP");
		LookupTableEntry itmLkpUser = lkp.getLookupTableEntry("user.admin.name");
		LookupTableEntry itmLkpPwd = lkp.getLookupTableEntry("user.admin.pwd");
		LookupTableEntry itmLkpCmp = lkp.getLookupTableEntry("company");
		
		String user = (String) itmLkpUser.getAttributeValue("Code_Value_LTS/Value");
		String pwd = (String) itmLkpPwd.getAttributeValue("Code_Value_LTS/Value");
		String cmp = (String) itmLkpCmp.getAttributeValue("Code_Value_LTS/Value");
		
		
		
		CatalogManager caMan = ctx.getCatalogManager();
		String url = "";
		Catalog ctg = caMan.getCatalog(ConstSantillana.MAESTRO_ARTICULOS);
		SelectionManager selectMng = ctx.getSelectionManager();
		String sSQL = "select item from catalog('Articulos') where item.category.pk = '0677' and item['Generales/Titulo_Corto'] like '%DEL%'";
		System.out.println(sSQL);
		DynamicItemSelection dynamic = (DynamicItemSelection) selectMng.getSelection("BusquedaTest");
		dynamic.setQuery(sSQL);
		dynamic.save();
		int idSelection = dynamic.getId();
		String sId = idSelection + "";
		url = "http://10.100.80.160:7507/ccd_content/classicornew.wpc?doit=edit_selection_items&catalog_id=12209&selection_id=" + sId;
		System.out.println(url);
		urlJSON.put("url", url);
		aListOrden.add(urlJSON);
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		responseContent = aListOrden.serialize(true);
		
	}

	

}
